<?php
// +----------------------------------------------------------------------
// | makePHP 
// +----------------------------------------------------------------------
// | Copyright (c) 2009 http://makephp.org All rights reserved.
// +----------------------------------------------------------------------
// | Licensed BSD.(http://www.make.org/BSD-license.txt)
// +----------------------------------------------------------------------
// | Author: 叁石(sanshi) <sanshi0815@tom.com>
// | Author: 白家昌<baijc2004cn@126.com>
// +----------------------------------------------------------------------

/**
 * 功能: 根据条件建立分类缓存减少类别使用
 * 创建日期:Thu May 31 15:55:11 CST 2007
 * 最后更新:
 * 作者: sanshi <sanshi0815@tom.com>
 */

class treeCache
{
	var $tableName = "index_category"; //表名
	var $where = "1";                 //where条件
	var $pidStr ="i_c_pid";           //pid 的字段名
	var $tempCode = array();         //生成文件的数组
	var $pid = 0;                    //pid的初始值
	var $db ;                        //数据库句柄
	var $idStr="i_c_id";             //取得的数据id
	var $title = "i_c_cn";           //名字字段
	var $createArrayName = "treeCache"; //建立的数组名字
	var $createFileName ="";        //建立文件的名字
	var $appendArr = array();       //附加的属性，需要字段名与数据里的名对应
	function treeCache()
	{
	}
	function set($db)
	{
		$this->db = $db;
		$this->tempCode[] = "<?php";
	}
	//取得所有的一级
	function getRootID()
	{
		$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE 
							{$this->pidStr}={$this->pid} AND {$this->where} ";
		$result = $this->db->select($sql);
		$temp = array();
		foreach ($result as $r)
		{
			$temp[]=$r["{$this->idStr}"];
		}
		$this->tempCode[] = "\${$this->createArrayName}['root']='".implode(',',$temp)."';";
		//print_r($temp);
		return $temp;
	}
	//取得子id
	function getChildren($pid)
	{
		$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE 
							{$this->pidStr}={$pid} AND {$this->where} ";
		$result = $this->db->select($sql);
		$temp = array();
		foreach ($result as $r)
		{
			$temp[]=$r["{$this->idStr}"];
		}
		return $temp;
	}
	//取得夫id
	function getParent($cid)
	{
		$sql = "SELECT {$this->pidStr} FROM {$this->tableName} WHERE 
							{$this->idStr}={$cid} AND {$this->where} ";
		$result = $this->db->select($sql);
		return $result[0]["{$this->pidStr}"];
	}
	//取得上级的id
	function getPidStr($cid,$pidStr="")
	{
		$pid=$this->getParent($cid);
		$temp = array();
		while ($pid!=$this->pid && !empty($pid)) {
			$temp[] = $pid;
			$pid=$this->getParent($pid);
		}
		//print_r($temp);
		return implode(',',$temp);	
	}
	//取得深度
	function getDepth($cid,$depth=0)
	{
		$pid=$this->getParent($cid);
		$depth++;
		if($pid!=$this->pid && !empty($pid))
			$depth = $this->getDepth($pid,$depth);
		return $depth;
	}
	//建立文件
	function make()
	{
		if(empty($this->createFileName)) 
			$this->createFileName = "{$this->createArrayName}.data.php";
			
		$rootArr = $this->getRootID();
		$selectF = "{$this->idStr},{$this->title},{$this->pidStr}";
		foreach ($this->appendArr as $app)
		{
			if(empty($app)) continue;
			$selectF .=",{$app}";
		}
		$sql = "SELECT {$selectF} FROM {$this->tableName} WHERE 
							{$this->where}";
		$result = $this->db->select($sql);
		for ($i=0;$i<count($result);$i++)
		{
			//id值
			$this->tempCode[] = 
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['id']='{$result[$i]["$this->idStr"]}';";
			//标题
			$this->tempCode[] =
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['title']='{$result[$i]["$this->title"]}';";
			//父id
			$this->tempCode[] =
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['pid']='{$result[$i]["$this->pidStr"]}';";
			//子id
			$this->tempCode[] =
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['cid']='".implode(',',$this->getChildren($result[$i]["$this->idStr"]))."';";
			//目录深度
			$this->tempCode[] =
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['depth']='".$this->getDepth($result[$i]["$this->idStr"])."';";
			//父id的id串
			$this->tempCode[] =
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['pstr']='".$this->getPidStr($result[$i]["$this->idStr"])."';";	
			//添加的附加属性
			foreach ($this->appendArr as $app)
			{
				if(empty($app)) continue;
			  $this->tempCode[] =
				"\${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['{$app}']='{$result[$i]["{$app}"]}';";
			}			
		}
		$this->tempCode[] = "return \${$this->createArrayName};";
		$this->tempCode[] = "?>";
		//$content = implode("\n",$this->tempCode);
		//print_r($this->tempCode);
		$content = implode("\n",$this->tempCode);
		//建立文件
		$fio=Factory::getBaseClass('FileIO');
		$fio->writeFile($this->createFileName,$content);
		return $content ;
	}
}
//加载的文件就是为了，数据库连接
//需要数据库有 select 方法
/*
include_once(dirname(dirname(__FILE__))."/config/config.inc.php");
include_once(CLASSES_PATH."factryObject.class.php");

$db = factryObject::getDB('indexPush');
$c = new treeCache($db);
$c->make();
//exit();

//做分析
include_once("treeCache.data.php");
$treeCache=isset($treeCache) ? $treeCache : array();
$rootStr = isset($treeCache['root']) ? $treeCache['root'] : "";
echo parseTree($treeCache,$rootStr);
function  parseTree($treeCache,$rootStr)
{
	$tempStr = "";
	$temp = explode(',',$rootStr);
	foreach ($temp AS $cid)
	{
		$info = $treeCache[$cid];
		$cidStr = $info['cid'];
		$tempStr .= str_repeat('-',($info['depth']-1)*3);
		$tempStr.=$info['title'];
		if(empty($info['pid']))
		{
			//附加操作
		}
		$tempStr .= "<br/>";
		if(!empty($info['cid']))
			$tempStr .=parseTree($treeCache,$info['cid']);
	}
	return $tempStr;
}
*/
?>